﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Linq;
using DACU.Tools;
using DACU.VkontakteApi.Enums;

namespace DACU.VkontakteApi.Base
{
	public class VKUserProfile
	{
		public string Id { get; set; }
		public string FirstName { get; set; }
		public string LastName { get; set; }
		public string NickName { get; set; }
		public VKSex Sex { get; set; }
		/// <summary>
		/// Дата рождения, выдаётся в формате: "23.11.1981" или "21.9" (если год скрыт).
		/// <br/>Если дата рождения скрыта целиком, то при приёме данных в формате XML в узле "user" отсутствует тег "bdate".
		/// </summary>
		public string BirthDate { get; set; }
		/// <summary>
		/// "id" города, указанного у пользователя в разделе "Контакты". Название города по его "id" можно узнать при помощи метода "getCities".
		/// <br/>Если город не указан, то при приёме данных в формате XML в узле "user" отсутствует тег "city".
		/// </summary>
		public string CityId { get; set; }
		/// <summary>
		/// id страны, указанной у пользователя в разделе "Контакты". Название страны по её id можно узнать при помощи метода getCountries.
		/// <br/>Если страна не указана, то при приёме данных в формате XML в узле user отсутствует тег country.
		/// </summary>
		public string CountryId { get; set; }
		/// <summary>
		/// url фотографии пользователя, имеющей ширину 50 пикселей.
		/// </summary>
		public string PhotoUrl { get; set; }
		/// <summary>
		/// url фотографии пользователя, имеющей ширину 100 пикселей.
		/// </summary>
		public string PhotoMediumUrl { get; set; }
		/// <summary>
		/// url фотографии пользователя, имеющей ширину 200 пикселей.
		/// </summary>
		public string PhotoBigUrl { get; set; }
		/// <summary>
		/// url квадратной фотографии пользователя, имеющей ширину 50 пикселей
		/// </summary>
		public string PhotoRectangleUrl { get; set; }
		public bool? IsOnline { get; set; }
		/// <summary>
		/// Список, содержащий id списков друзей, в которых состоит текущий друг пользователя.
		/// Метод получения id и названий списков: friends.getLists.
		/// <br/>Поле доступно только для метода friends.get. 
		/// <br/>Если текущий друг не состоит ни в одном списке, то при приёме данных в формате XML в узле user отсутствует тег lists.
		/// </summary>
		public int[] Lists { get; set; }
		/// <summary>
		/// короткий адрес страницы (возвращается только имя адреса, например vitaliy2). 
		/// <br/>Если пользователь не менял адрес своей страницы, возвращается 'id'+uid, например id35828305.
		/// </summary>
		public string Domain { get; set; }
		/// <summary>
		/// Показывает, известен ли номер мобильного телефона пользователя.
		/// <br/>Возвращаемые значения: 1 - известен, 0 - не известен.
		/// <br/>Рекомендуется перед вызовом метода secure.sendSMSNotification.
		/// </summary>
		public bool? HasMobile { get; set; }
		public string HomePhone { get; set; }
		public string MobilePhone { get; set; }
		/// <summary>
		/// рейтинг пользователя.
		/// </summary>
		public string Rate { get; set; }
		/// <summary>
		/// код университета пользователя.
		/// </summary>
		public string UniversityId { get; set; }
		/// <summary>
		/// название университета пользователя.
		/// </summary>
		public string UniversityName { get; set; }
		/// <summary>
		/// код факультета пользователя.
		/// </summary>
		public string FacultyId { get; set; }
		/// <summary>
		/// название факультета пользователя.
		/// </summary>
		public string FacultyName { get; set; }
		/// <summary>
		/// год выпуска.
		/// </summary>
		public string Graduation { get; set; }
		public bool IsCurrentUser
		{
			get { return Id != null ? Id.Equals(VKApi.CurrentUserId) : false; }
		}
		public bool IsEmpty
		{
			get { return String.IsNullOrWhiteSpace(Id); }
		}

		static VKUserProfile ParseJson(string response)
		{
			throw new NotImplementedException();
		}

		public static VKUserProfile ParseResponse(string response, VKResponseFormats format)
		{
			if (String.IsNullOrWhiteSpace(response)) throw new ArgumentNullException("reponse");
			switch (format)
			{
				case VKResponseFormats.JSON:
					throw new NotImplementedException();
				case VKResponseFormats.XML:
					return ParseXml(XElement.Parse(response, LoadOptions.None).Element("user"));
				default:
					return new VKUserProfile();
			}
		}

		public static VKUserProfile ParseXml(XElement response)
		{
			#region comment

			/*
			 * uid,
			 * first_name,
			 * last_name,
			 * nickname,
			 * sex,
			 * bdate (birthdate),
			 * city,
			 * country,
			 * timezone,
			 * photo,
			 * photo_medium,
			 * photo_big,
			 * online,
			 * lists,
			 * domain.
			 * 
			 * Если в параметре fields было указано поле contacts, то будут доступны также поля:
			 * home_phone,
			 * mobile_phone.
			 * 
			 * Если в параметре fields было указано поле education, то будут доступны также поля:
			 * university,
			 * university_name,
			 * faculty,
			 * faculty_name,
			 * graduation.
			*/

			#endregion

			if (response == null || response.IsEmpty) throw new ArgumentNullException("response");
			var userProfile = new VKUserProfile
			                  	{
			                  		Id = XmlUtils.GetNodeString(response.Element("uid")),
			                  		BirthDate = XmlUtils.GetNodeString(response.Element("bdate")),
			                  		CityId = XmlUtils.GetNodeString(response.Element("city")),
			                  		CountryId = XmlUtils.GetNodeString(response.Element("country")),
			                  		Domain = XmlUtils.GetNodeString(response.Element("domain")),
			                  		FacultyId = XmlUtils.GetNodeString(response.Element("faculty")),
			                  		FacultyName = XmlUtils.GetNodeString(response.Element("faculty_name")),
			                  		FirstName = XmlUtils.GetNodeString(response.Element("first_name")),
			                  		Graduation = XmlUtils.GetNodeString(response.Element("graduation")),
			                  		HasMobile = XmlUtils.NodeValueToBool(response.Element("has_mobile")),
			                  		HomePhone = XmlUtils.GetNodeString(response.Element("home_phone")),
			                  		IsOnline = XmlUtils.NodeValueToBool(response.Element("online")),
			                  		LastName = XmlUtils.GetNodeString(response.Element("last_name")),
			                  		Lists = XmlUtils.NodeValueToArray(response.Element("lists")),
			                  		MobilePhone = XmlUtils.GetNodeString(response.Element("mobile_phone")),
			                  		NickName = XmlUtils.GetNodeString(response.Element("nickname")),
			                  		PhotoBigUrl = XmlUtils.GetNodeString(response.Element("photo_big")),
			                  		PhotoMediumUrl = XmlUtils.GetNodeString(response.Element("photo_medium")),
			                  		PhotoRectangleUrl = XmlUtils.GetNodeString(response.Element("photo_rec")),
			                  		PhotoUrl = XmlUtils.GetNodeString(response.Element("photo")),
			                  		Rate = XmlUtils.GetNodeString(response.Element("rate")),
			                  		Sex = XmlUtils.NodeValueToVKSex(response.Element("sex")),
			                  		UniversityId = XmlUtils.GetNodeString(response.Element("university")),
			                  		UniversityName = XmlUtils.GetNodeString(response.Element("university_name"))
			                  	};
			return userProfile;
		}

		public override string ToString()
		{
			return Id + " | " + FirstName + " | " + LastName + " | " + IsOnline;
		}
	}
}
